package main

import (
	"fmt"
)

// panic 抛出异常
func main() {
	fmt.Println("222》》》》》")
	err := d5_03()
	fmt.Println(err)
	fmt.Println("222《《《《《")
}

// 向外抛出异常
func d5_01() {
	var a int
	if a == 0 {
		panic("a dont is 0")
	}
}

// 使用recover捕获异常
func d5_02() (err error) {
	// 捕获异常
	defer func() {
		switch p := recover(); p {
		case nil: // no panic
			err = fmt.Errorf("空指针异常")
		default:
			err = fmt.Errorf("internal error: %v", p)
		}
	}()
	// 抛出异常
	d5_01()
	return nil
}

// 封装的公共函数，用于捕获并处理panic异常
func recoverWrapper(err *error) {
	switch p := recover(); p {
	case nil: // no panic
		*err = fmt.Errorf("空指针异常")
	default:
		*err = fmt.Errorf("internal error: %v", p)
	}
}

func d5_03() (err error) {
	// 捕获异常
	defer recoverWrapper(&err)
	// 抛出异常
	d5_01()
	return nil
}
